home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 30
/
PCMania CD30.iso
/
pcmania
/
c30
/
inverx.c
next >
Wrap
C/C++ Source or Header
|
1995-02-22
|
5KB
|
195 lines
#include <stdio.h>
struct cabecera{
char indicador; /* constante. Si=10 es un archivo PCX */
char version; /* version pcx */
char codificacion; /* Si=1 el PCX esta comprimido */
char bits_pixel; /* bits por pixel (1,2,4,8) */
unsigned int Xmin;
/* los 4 campos que siguen dan el recuadrado de la imagen */
unsigned int Ymin;
unsigned int Xmax;
unsigned int Ymax;
unsigned int Hres;
unsigned int Vres;
char paleta_16[48]; /* si la pcx tiene <=16 colores, aqui paleta */
char reserv1; /* reservado */
char nplanos; /* num. de planos usados en la imagen */
unsigned int bytes_linea; /* bytes necesarios para decodificar una linea */
unsigned int infopal; /* Si=1 color o blanco y negro. 0=grises */
unsigned int anchura; /* anchura de la imagen */
unsigned int altura; /* altura de la imagen */
char sobrante[54]; /* sobrante de cabecera para futuras ampliaciones */
unsigned char datos[32767];
};
struct cabecera buffer; /* estructura para la cabecera de f. pcx */
unsigned char string[50]; /* cadenas para el nombre */
unsigned char mam[30];
main()
{
unsigned char tecla;
principio:
scr_setmode(3);
exec("\\command.com", "/cdir /w *.pcx");
printf("indica la pantalla a tratar ");
scanf("%s",mam);
scr_setmode(19); /* pone el modo grafico de 320*200 con 256 colores */
/* scr_clr(); esta funcion borra la pantalla y coloca el cursor
en la esquina superior izquierda. No es una funcion estandard de C, sino propia
del PCC y su nombre varia en otros compiladores */
strcpy(string,mam);
strcat(string,".pcx");
loadPCX();
scr_ci();
scr_setmode(3);
puts("¿Deseo invertirla S/N? ");
tecla=scr_ci();
if (tecla!='s' && tecla!='S')
{
puts("\n¿Deseo visualizar otra pantalla S/N? ");
tecla=scr_ci();
if (tecla=='s' || tecla=='S')
goto principio;
exit(0);
}
else
scr_setmode(19);
loadPCX();
inversionX();
scr_ci();
goto principio;
}
loadPCX()
{
unsigned int pos,posp,pal;
unsigned char con;
unsigned contx,conty; /* contadores de filas y columnas */
FILE *fichero;
unsigned pantalla; /* guarda el segmento a la pantalla */
unsigned char *paleta; /* puntero a la paleta */
pantalla=40960; /* segmento de pantalla */
/* esta rutina solo visualiza bien las pcx a 320*200 */
if ((fichero=fopen(string,"rb"))==0)
{
printf("\n Error: El fichero no puede abrirse!\n\n");
exit(1);
}
fread(&buffer,32767,1,fichero);
pos=0; /* inicializar indice para buffer.datos[] */
posp=0; /* inicializar posicion para pantalla */
if (buffer.Ymax-buffer.Ymin>200 || buffer.Xmax-buffer.Xmin>320)
{
puts("\nEsta pcx excede al tamaño tratable");
exit(1);
}
for(conty=0;conty<(buffer.Ymax-buffer.Ymin)+1;conty++)
for(contx=0;contx<(buffer.Xmax-buffer.Xmin)+1;)
{
if (pos==32639)
{
fread(&buffer+128,32000,1,fichero);
pos=0;
}
if ((buffer.datos[pos]&192)==192)
/* codificacion RLE: el byte que sigue ha de ser repetido */
{
con=buffer.datos[pos]&63; /* numero de repeticiones para el byte */
if (pos+1<32639)
{
while(con!=0)
{
_poke(buffer.datos[pos+1],posp,pantalla);
posp++;
contx++;
con--;
}
pos+=2;
}
else
{
fread(&buffer+128,32000,1,fichero);
pos=0;
while(con!=0)
{
_poke(buffer.datos[pos],posp,pantalla);
posp++;
contx++;
con--;
}
pos++;
}
}
else
{ /* tratamiento para pixel no repetido */
_poke(buffer.datos[pos],posp,pantalla);
posp++;
contx++;
pos++;
}
}
/* la paleta se encuentra en los ultimos 768 bytes del f.
antes que nada hay que desplazar los 768 bytes 2 pos. a la der. */
pos++;
paleta=&buffer.datos[pos];
for (pal=0;pal<768;pal++)
buffer.datos[pos+pal]/=4;
prepal(paleta);
}
inversionX()
{
unsigned a,b,c,d,pantalla;
unsigned char swap1,swap2;
pantalla=40960;
for (a=0;a<200;a++)
for (b=0,c=319;b<160;b++,c--)
{
swap1=_peek((a*320)+b,pantalla);
swap2=_peek((a*320)+c,pantalla);
_poke(swap2,(a*320)+b,pantalla);
_poke(swap1,(a*320)+c,pantalla);
}
}
prepal(paleta)
{
unsigned char *paleta;
#asm
MOV DX,[BP+4] ;paleta
PUSH BP
PUSH DS
PUSH ES
PUSH SI
PUSH DI
MOV AX,DS
MOV ES,AX
MOV AX,1012h
mov BX,0
mov CX,256
INT 10h
POP DI
POP SI
POP ES
POP DS
POP BP
#
}